# -*- conding:UTF-8 -*-

'''
@ Project: p6_421
@ File: serializers.py
@ Author: 罗婷
@ Date：2022/4/22 8:50

'''
import re

from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework.serializers import ModelSerializer

from users.models import Department, Duty, Staff, User, Permission, PermissionType


# 部门序列化器
class DepartmentSer(serializers.Serializer):
    # label='浏览器显示的名称', read_only=True 只读   allow_null=True可以为空     trim_whitespace=True去掉两边的空格
    id = serializers.IntegerField(label='部门编号', read_only=True)
    name = serializers.CharField(label='部门名称', max_length=50, min_length=1, allow_null=True, trim_whitespace=True)
    create_time =serializers.DateTimeField()
    # 全局校验  校验所有数据
    def validate(self, data):
        pass
        return data

    # 重写create方法
    def create(self, validated_data):  # validated_data已经验证过的数据  字典类型
        # 保存数据 写入数据库
        dep = Department.objects.create(**validated_data)   # **解包 将字典解包为key value的关键字参数
        return dep

    # 重写update方法
    def update(self, instance, validated_data):  # instance要修改的对象
        instance.name = validated_data.get('name')  # 前方传来的经过验证的数据的字段 赋值给 instance的字段
        instance.save()    # 保存数据
        return instance

# 指定validators参数 validators=[a,]然后定义test函数 完成校验规则
def a(name):
    return name

# 职责序列化器
class DutySer(serializers.Serializer):
    # label='浏览器显示的名称', read_only=True 只读   allow_null=True可以为空     trim_whitespace=True去掉两边的空格
    id = serializers.IntegerField(label='职责编号', read_only=True)
    name = serializers.CharField(label='职责名称', max_length=50, min_length=1, allow_null=False, trim_whitespace=True, validators=[a,])
    create_time = serializers.DateTimeField()
    # 局部校验
    # def validate_name(self, name):
    #     if re.findall(r'~[A-Z]$',name):
    #         return name
    #     else:
    #         raise ValidationError('职责名称不符合规则')

    # 全局校验  校验所有数据
    def validate(self, data):
        return data

    # 重写create方法
    def create(self, validated_data):  # validated_data已经验证过的数据  字典类型
        # 保存数据 写入数据库
        dut = Duty.objects.create(**validated_data)   # **解包 将字典解包为key value的关键字参数
        return dut

    # 重写update方法
    def update(self, instance, validated_data):  # instance要修改的对象
        instance.name = validated_data.get('name')  # 前方传来的经过验证的数据的字段 赋值给 instance的字段
        instance.save()    # 保存数据
        return instance

# 员工序列化器
# class StaffSer(serializers.Serializer):
#     SEX_CHOICE = (
#         (1, '男'),
#         (2, '女')
#     )
#     # 外键
#     # read_only=True时，只序列化输出
#     # queryset时，可以反序列化输入
#
#     id = serializers.IntegerField(label='职责编号', read_only=True)
#     name = serializers.CharField(max_length=30, label='姓名')
#     sex = serializers.ChoiceField(choices=SEX_CHOICE, default=1, label='性别')
#     phone = serializers.CharField(max_length=11, label='手机号')
#     email = serializers.EmailField(max_length=60, label='邮箱')
#     department = serializers.PrimaryKeyRelatedField(queryset=Department.objects.all(), label="部门")
#     duty = serializers.PrimaryKeyRelatedField(queryset=Duty.objects.all(), label="职责")
#
#
#     # 重写create方法
#     def create(self, validated_data):  # validated_data已经验证过的数据  字典类型
#         # 保存数据 写入数据库
#         sta = Staff.objects.create(**validated_data)   # **解包 将字典解包为key value的关键字参数
#         return sta





# 员工序列化器
class StaffSer(ModelSerializer):

    # 有choices 选项的字段  定义get_ 方法
    sex_name = serializers.SerializerMethodField(read_only=True)
    def get_sex_name(self, obj):
        return obj.get_sex_display()

    # 外键自定义  obj 代表当前需要序列化的对象
    department_name = serializers.SerializerMethodField()
    duty_name = serializers.SerializerMethodField()
    def get_department_name(self, obj):
        return obj.department.name    # 此时obj就是部门对象     obj.对象.字段
    def get_duty_name(self, obj):
        return obj.duty.name

    class Meta:
        model = Staff
        fields = '__all__'

# 用户序列化器
class User_Serializer(ModelSerializer):
    password = serializers.CharField(write_only=True, trim_whitespace=True,
                                     max_length=50, min_length=2)
    class Meta:
        model = User
        fields = ['id', 'username', 'last_login', 'password', 'phone', 'date_joined', 'email']
        read_only_fields = ['id', 'date_joined']  # 只读,不需要输入

    # 修改用户信息  重写update方法
    def update(self, instance, validated_data):
        instance.username = validated_data.get('username')
        instance.set_password(validated_data.get('password'))
        instance.phone = validated_data.get('phone')
        instance.email = validated_data.get('email')
        instance.save()
        return instance

    # 添加用户信息   重写create方法
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user

# 权限序列化器
class Permission_Serializer(ModelSerializer):
    typename = serializers.SerializerMethodField(read_only=True)
    def get_typename(self, obj):
        return obj.type_name.name

    class Meta:
        model = Permission
        fields = '__all__'


# 权限类型序列化器
class PermissionType_Serializer(ModelSerializer):

    class Meta:
        model = PermissionType
        fields = '__all__'










